package top.ooyyh.bytheway.utils;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import javax.servlet.http.HttpSession;
import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtils {

    // 密钥（建议从配置文件中读取）
    private static final String SECRET_KEY = "your-256-bit-secret-key-must-be-at-least-32-chars";
    private static final Key KEY = Keys.hmacShaKeyFor(SECRET_KEY.getBytes());

    // Token 过期时间（单位：毫秒）
    private static final long EXPIRATION_TIME = 86400000; // 24小时

    /**
     * 生成 JWT Token
     * @param claims 自定义数据（如用户ID、角色等）
     * @return Token字符串
     */
    public static String generateToken(Map<String, Object> claims) {
        return Jwts.builder()
                .setClaims(claims) // 设置Payload数据
                .setIssuedAt(new Date()) // 签发时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 过期时间
                .signWith(KEY, SignatureAlgorithm.HS256) // 签名算法
                .compact(); // 生成Token
    }

    /**
     * 解析 JWT Token
     * @param token Token字符串
     * @return Claims（Payload数据）
     * @throws ExpiredJwtException Token过期
     * @throws JwtException Token无效
     */
    public static Claims parseToken(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(KEY)
                .build()
                .parseClaimsJws(token)
                .getBody();
    }

    /**
     * 验证 Token 是否有效
     * @param token Token字符串
     * @return 是否有效
     */
    public static boolean validateToken(String token) {
        try {
            parseToken(token);
            return true;
        } catch (ExpiredJwtException e) {
            System.err.println("Token 已过期");
        } catch (JwtException e) {
            System.err.println("Token 无效");
        }
        return false;
    }

}
